#
# Main makefile
#

# I hope this doesn't break your build, but I've got different names for the tools. The contents 
# of Makefile.local on my machine are:
#  BINPATH=$(HOME)/gc/bin
#  CROSS=powerpc-eabi-elf
#  CC=$(BINPATH)/$(CROSS)-gcc
#  OBJCOPY=$(BINPATH)/$(CROSS)-objcopy
#  LD=$(BINPATH)/$(CROSS)-ld
#  AS=$(BINPATH)/$(CROSS)-as
#  
#  CFLAGS_LOCAL=-DSAMSON=1
# it is excluded from CVS, to not conflict with your settings.


CROSS=powerpc-elf-
CC=$(CROSS)gcc
OBJCOPY=$(CROSS)objcopy
LD=$(CROSS)ld
AS=$(CROSS)as

CFLAGS_LOCAL=


DOLTOOL=doltool





# Configuration
CFLAGS = -Wall -nostdinc $(CFLAGS_LOCAL) -I. -Ilwip/include \
	-Iinclude -Ilwip/arch/gc/include -I./lwip/include/ipv4  -Os -fno-exceptions
AFLAGS = -Iinclude
LDFLAGS =  -nostdlib

#-DLWIP_DEBUG -O2 
#-Werror

# Files
MAIN_OBJS = \
	main.o

IO_OBJS = \
	io/video.o io/console.o io/console_font.o io/vsprintf.o \
	io/exi.o io/dvd.o  io/network.o io/sram.o

IPL_OBJS = \
	ipl/ipl.o ipl/flash.o

LOWLEVEL_OBJS = \
	lowlevel/cache.o lowlevel/exception.o lowlevel/exceptionc.o \
	lowlevel/irq.o lowlevel/string_asm.o lowlevel/string.o \
	lowlevel/ctype.o lowlevel/time.o

LOAD_OBJS = \
	load/elf.o load/dol.o load/dolup.o load/loadapp.o

DISK_OBJS = \
	disk/sd.o disk/fat.o disk/file.o io/pad.o asmappload.o anaconda.o

LWIP_OBJS = \
	lwip/core/tcp_in.o \
	lwip/core/inet.o lwip/core/mem.o lwip/core/memp.o \
	lwip/core/netif.o lwip/core/pbuf.o lwip/core/raw.o  lwip/core/stats.o \
	lwip/core/sys.o lwip/core/tcp.o lwip/core/ipv4/ip_addr.o \
	lwip/core/ipv4/icmp.o lwip/core/ipv4/ip.o lwip/core/ipv4/ip_frag.o \
	lwip/core/tcp_out.o lwip/core/udp.o lwip/netif/etharp.o \
	./lwip/arch/gc/lib.o   ./lwip/arch/gc/netif/gcif.o \
	./lwip/arch/gc/lib_arch.o \

#lwip/core/dhcp.o 

HTTPD_OBJS = \
	httpd/vfs.o httpd/httpd.o httpd/flash_put.o

LIBRARIES =
# gdbstub/libgdbstub.a

# ./lwip/core/dhcp.o 

OBJS = lowlevel/crt0.o $(MAIN_OBJS) $(IPL_OBJS) $(IO_OBJS) $(LOWLEVEL_OBJS) \
	$(DISK_OBJS) $(LOAD_OBJS) $(LWIP_OBJS) $(HTTPD_OBJS) $(LIBRARIES)

# Build rules
all: main.dol main_boot.bin

clean:
	rm -rf $(OBJS)
	
realclean:
	find -name '*.o' | xargs -r rm
	find -name '*.a' | xargs -r rm
	find -name '*~' | xargs -r rm
	find -name '*.bin' | xargs -r rm
	find -name '*.dol' | xargs -r rm
	find -name '*.elf' | xargs -r rm
	find -name '*.map' | xargs -r rm
	find -name '*.tmp' | xargs -r rm


.c.o:
	$(CC) $(CFLAGS) -c -o $@ $*.c

.S.o:
	$(CC) $(AFLAGS) -c -o $@ $*.S

#main.dol: dolhdr main.bin 
#	cat dolhdr main.bin > $@

psoload: main.dol
	$(PSOLOAD) $(PSOLOAD_ARGS) main.dol

main.dol: main.elf
	$(DOLTOOL) -d main.elf

main.bin: main.elf
	$(OBJCOPY) -O binary $< $@

main_boot.bin: main_boot.elf
	$(OBJCOPY) -O binary $< $@

main.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Ttext=0x80D00000 $(OBJS) -Wl,-Map -Wl,main.map
#	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Ttext=0x81300000 $(OBJS) -Wl,-Map -Wl,main.map
	$(CC) $(LDFLAGS) -Wl,-n -o main_high.elf -Wl,-Ttext=0x81300000 $(OBJS) -Wl,-Map -Wl,main_high.map

main_boot.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Tboot.lds $(OBJS) -Wl,-Map -Wl,main_boot.map


gdbstub/libgdbstub.a:
	$(MAKE) -C gdbstub

# TODO: dependencies
